from django.shortcuts import render

# Create your views here.

"""
需求：
根据点击的分类，获取分类下的所有商品（有排序，有分类）

前端：
前端会发送一个axios请求，分类id在路由中，分页的页码，每页多少数据，排序也会传过来

后端：
路由：GET /list/<category_id>/skus/

请求参数：
    1. category_id 分类id
    2. page 页码
    3. page_size 每页数量
    4. ordering 排序

响应数据：
    1. code 状态码
    2. errmsg 错误信息
    3. breadcrumb 面包屑导航
    4. list 商品列表
    5. count 总页数

步骤：
    1. 接收参数
    2. 获取分类id
    3. 根据id进行分类数据的查询验证
    4. 获取面包屑数据
    5. 查询分类对应的sku数据，然后排序，然后分页
    6. 返回响应
"""
from django.views import View
from django.http import JsonResponse
from utils.views import LoginRequiredJSONMixin
from apps.goods.models import GoodsCategory,SKU
from utils.goods import get_breadcrumb

class ListView(View):
    def get(self,request,category_id):
        # 1. 接收参数
        ## 1.1 排序参数
        ordering = request.GET.get('ordering')
        ## 1.2 分页参数
        page_size = request.GET.get('page_size')
        ## 1.3 第几页参数
        page = request.GET.get('page')
        
        
        # 2. 获取分类id
        category_id = int(category_id)
        # 3. 根据id进行分类数据的查询验证
        try:
            category = GoodsCategory.objects.get(id=category_id)
        except GoodsCategory.DoesNotExist:
            return JsonResponse({'code':400,'errmsg':'category_id不存在'})
        # 4. 获取面包屑数据
        breadcrumb = get_breadcrumb(category)
        # 5. 查询分类对应的sku数据,排序，分页
        skus = SKU.objects.filter(category=category,is_launched=True).order_by(ordering)
        ## 分页
        from django.core.paginator import Paginator
        # 创建分页对象
        paginator = Paginator(skus, per_page=page_size)
        # 获取分页之后的页面
        page_skus = paginator.page(page)
        
        list = []
        # 整理格式:
        for sku in page_skus:
            list.append({
                'id':sku.id,
                'default_image_url':sku.default_image.url,
                'name':sku.name,
                'price':sku.price
            })
        
        # 获取列表页总页数
        total_page = paginator.num_pages

        # 6. 把数据变为 json 发送给前端
        return JsonResponse({
                             'code':0,
                             'errmsg':'ok',
                             'breadcrumb': breadcrumb,
                             'list':list,
                             'count':total_page
                            })
        
        
from haystack.views import SearchView

class MySearchView(SearchView):
    '''重写SearchView类'''
    def create_response(self):
        # 获取搜索结果
        context = self.get_context()
        data_list = []
        for sku in context['page'].object_list:
            data_list.append({
                'id':sku.object.id,
                'name':sku.object.name,
                'price':sku.object.price,
                'default_image_url':sku.object.default_image.url,
                'searchkey':context.get('query'),
                'page_size':context['page'].paginator.num_pages,
                'count':context['page'].paginator.count
            })
        # 拼接参数, 返回
        return JsonResponse(data_list, safe=False)
        
from utils.goods import get_breadcrumb, get_categories,get_goods_specs
class DetailView(View):
    def get(self,request,sku_id):
        try:
            sku = SKU.objects.get(id=sku_id)
        except SKU.DoesNotExist:
            return JsonResponse({'code':400,'errmsg':'sku_id不存在'})
        # 1. 分类数据
        categories = get_categories()
        # 2. 面包屑
        breadcrumb = get_breadcrumb(sku.category)
        # 3. SKU信息

        # 4. 商品规格信息
        specs = get_goods_specs(sku)
        # 5. 组织数据
        context = {
            'categories':categories,
            'breadcrumb':breadcrumb,
            'sku':sku,
            'specs':specs
        }
        return render(request,'detail.html',context)
"""
首先，详情页面
我们都是先查询数据库的数据
在进行html的渲染

不管是数据库的数据缓存还是html的渲染，都需要时间，影响用户体验

最好的体验是 
用户直接访问到 经过数据库查询，html渲染的详情页面

但是，用户第一次访问详情页面的时候，需要查询数据库，渲染html
用户第二次访问详情页面的时候，直接访问缓存中的详情页面，不需要查询数据库，也不需要渲染html

所以，我们可以使用 模板缓存 来优化详情页面的访问速度

模板缓存：
    1. 模板缓存是在渲染模板的时候，把渲染的html页面缓存到文件中
    2. 下次渲染这个模板的时候，直接从文件中读取html页面，不需要渲染模板
用户直接就可以访问到 经过数据库查询，html渲染的详情页面

但是，模板缓存是有时间限制的，过期了就失效了，所以，我们需要在什么时候失效呢？
    1. 当模板有更新的时候，失效
    2. 当模板缓存的文件有更新的时候，失效

所以，我们需要在什么时候更新模板缓存呢？
    1. 当模板有更新的时候，更新模板缓存
    2. 当模板缓存的文件有更新的时候，更新模板缓存
"""
"""

提示：

商品详情页查询数据量大，而且是用户频繁访问的页面。
类似首页广告，为了减少数据库查询次数，提升页面响应效率，我们也要对详情页进行静态化处理。
静态化说明：

首页广告的数据变化非常的频繁，所以我们最终使用了定时任务进行静态化。
详情页的数据变化的频率没有首页广告那么频繁，而且是当SKU信息有改变时才要更新的，所以我们采用新的静态化方案。
方案一：通过Python脚本手动一次性批量生成所有商品静态详情页。
方案二：后台运营人员修改了SKU信息时，异步的静态化对应的商品详情页面。
我们在这里先使用方案一来静态详情页。当有运营人员参与时才会补充方案二。
注意：

用户数据和购物车数据不能静态化。
热销排行和商品评价不能静态化。

"""


       
       
class DetailVisitView(View):
    """详情页分类商品访问量"""
    def post(self, request, category_id):
        try:
            # 1.获取当前商品
            category = GoodsCategory.objects.get(id=category_id)
        except Exception as e:
            return JsonResponse({'code': 400, 'errmsg': '缺少必传参数'})

        # 2.查询日期数据
        from datetime import date
        # 获取当天日期
        today_date = date.today()

        from apps.goods.models import GoodsVisitCount
        try:
            # 3.如果有当天商品分类的数据  就累加数量
            count_data = category.goodsvisitcount_set.get(date=today_date)
        except:
            # 4. 没有, 就新建之后在增加
            count_data = GoodsVisitCount()

        try:
            count_data.count += 1
            count_data.category = category
            count_data.save()
        except Exception as e:
            return JsonResponse({'code': 400, 'errmsg': '新增失败'})

        return JsonResponse({'code': 0, 'errmsg': 'OK'})
